home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 20
/
Cream of the Crop 20 (Terry Blount) (1996).iso
/
program
/
recio214.zip
/
RGET.C
< prev
next >
Wrap
C/C++ Source or Header
|
1996-06-14
|
23KB
|
629 lines
/*****************************************************************************
MODULE: rget.c
PURPOSE: recio input functions
COPYRIGHT: (C) 1994-1996, William Pierpoint
COMPILER: Borland C Version 3.1
OS: MSDOS Version 6.2
VERSION: 2.14
RELEASE: June 14, 1996
*****************************************************************************/
#include <ctype.h>
#include <errno.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "recio.h"
extern int _risready(REC *rp, int mode);
extern int _rmoderror(REC *rp, int mode);
extern void _rsetexitfn(REC *rp);
/* private macros */
#define RECBUFSIZ_MIN 2 /* min one character and new line */
#define FLDBUFSIZ_MIN 1 /* min one character */
#define RECBUFSIZE max(RECBUFSIZ, RECBUFSIZ_MIN)
#define FLDBUFSIZE max(FLDBUFSIZ, FLDBUFSIZ_MIN)
#define rcol(rp) ((rp)->r_colno)
#define rflags(rp) ((rp)->r_flags)
#define rfd(rp) ((rp)->r_fd)
#define rfp(rp) ((rp)->r_fp)
#define rreclen(rp) ((rp)->r_reclen)
#define rrecsiz(rp) ((rp)->r_recsiz)
#define rfldsiz(rp) ((rp)->r_fldsiz)
#define rfldch(rp) ((rp)->r_fldch)
#define rtxtch(rp) ((rp)->r_txtch)
/****************************************************************************/
static int /* return error number (0=no error) */
_rsetfldsiz( /* set field buffer size */
REC *rp, /* record pointer */
size_t fldsiz) /* field buffer size */
/****************************************************************************/
{
int errnum=0; /* error number */
char *fldp; /* pointer to new field buffer */
/* if no memory allocated to field buffer */
if (!rflds(rp)) {
/* determine minimum size of field buffer */
fldsiz = max(fldsiz, FLDBUFSIZE);
/* initially allocate memory for field buffer */
do {
fldp = (char *) calloc(fldsiz+1, sizeof(char));
if (!fldp) {
errnum = rseterr(rp, R_ENOMEM);
if (errnum) goto done;
}
} while (!fldp);
rflds(rp) = fldp;
rfldsiz(rp) = fldsiz;
_rsetexitfn(rp);
/* if field buffer needs to be larger */
} else if (fldsiz > rfldsiz(rp)) {
/* reallocate memory for field buffer */
do {
fldp = (char *) realloc(rflds(rp), fldsiz+1);
if (!fldp) {
errnum = rseterr(rp, R_ENOMEM);
if (errnum) goto done;
}
} while (!fldp);
rflds(rp) = fldp;
rfldsiz(rp) = fldsiz;
}
done:
return errnum;
}
/****************************************************************************/
static int /* return error number (0=no error) */
_rsetrecsiz( /* set record buffer size */
REC *rp, /* record pointer */
size_t recsiz) /* record buffer size */
/****************************************************************************/
{
int errnum=0; /* error number */
char *recp; /* pointer to new record buffer */
/* if no memory allocated to field buffer */
if (!rrecs(rp)) {
/* determine minimum size of record buffer */
recsiz = max(recsiz, RECBUFSIZE);
/* initially allocate memory for record buffer */
do {
recp = (char *) calloc(recsiz+1, sizeof(char));
if (!recp) {
errnum = rseterr(rp, R_ENOMEM);
if (errnum) goto done;
}
} while (!recp);
rrecs(rp) = recp;
rrecsiz(rp) = recsiz;
_rsetexitfn(rp);
/* if record buffer needs to be larger */
} else if (recsiz > rrecsiz(rp)) {
/* reallocate memory for record buffer */
do {
recp = (char *) realloc(rrecs(rp), recsiz+1);
if (!recp) {
errnum = rseterr(rp, R_ENOMEM);
if (errnum) goto done;
}
} while (!recp);
rrecs(rp) = recp;
rrecsiz(rp) = recsiz;
}
done:
return errnum;
}
/****************************************************************************/
static int /* return !0 on match */
risfldch( /* is character the field separator character? */
REC *rp, /* record pointer */
int ch) /* character to test */
/****************************************************************************/
{
int ismatch=0; /* return 0 if no match */
if (isascii(ch)) {
if (rfldch(rp) == ' ') {
ismatch = isspace(ch);
} else {
ismatch = (!(ch - rfldch(rp)));
}
}
return ismatch;
}
/****************************************************************************/
static int /* return !0 on match */
ristxtch( /* is character the text delimiter character? */
REC *rp, /* record pointer */
int ch) /* character to test */
/****************************************************************************/
{
int ismatch=0; /* return 0 if no match */
if (isascii(ch)) {
if (rtxtch(rp) == ' ') {
ismatch = isspace(ch);
} else {
ismatch = (!(ch - rtxtch(rp)));
}
}
return ismatch;
}
/****************************************************************************/
static size_t /* return length of field */
_rfldlen( /* get length of field */
REC *rp) /* record pointer */
/****************************************************************************/
{
size_t len=0; /* length of field (0=missing field) */
size_t col; /* column location */
size_t co; /* temporary column location */
int qstate=0; /* nested quoted text state (0=off; 1=on) */
/* clear quoted text char flag */
rflags(rp) &= ~_R_TXT;
/* skip past any leading whitespace */
for (col=rcol(rp); col < rreclen(rp); col++) {
if (!isspace(rrecs(rp)[col])) break;
}
/* is first non-whitespace character the txtch? */
if (ristxtch(rp, rrecs(rp)[col])) { /* yes, quoted text */
rflags(rp) |= _R_TXT; /* set quoted text char flag */
if (risfldch(rp, ' ')) { /* fldch == ' '; txtch != ' ' */
/* skip over characters that are not txtch */
for (col++; col < rreclen(rp); col++) {
/* if txtch, see if end-of-field */
if (ristxtch(rp, rrecs(rp)[col])) {
/* don't end field within any nested quoted text */
if (ristxtch(rp, '"')) {
qstate = !qstate;
if (!qstate) continue;
}
/* if whitespace follows txtch, then end-of-field */
if (isspace(rrecs(rp)[col+1])) {
/* skip to end of trailing whitespace */
for (col++; col < rreclen(rp); col++) {
if (!isspace(rrecs(rp)[col])) {
col--;
break;
}
}
break;
}
}
}
} else { /* fldch != ' ';